<?php
 
class EgresoccController extends Zend_Controller_Action
{
    
    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //---------------------------------//
    //             PAGINAS             //
    //---------------------------------//

    public function crearAction()
    {
        if (X\CheckAccess::PageAction('Egreso de caja chica.crear')) return;

        try{
            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '1=1';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();

            // obtener los datos
            $cuentas = $this->em->createQueryBuilder()
                        ->select         ('c.codigoCuenta')
                        ->addselect      ('r.nombreRubro')
                        ->addselect      ('r.codigo')
                        ->from           ('Default_Model_Cuenta', 'c')
                        ->leftJoin       ('c.rubro',              'r')
                        ->leftJoin       ('c.presupuesto',        'p')
                        ->leftJoin       ('c.departamento',       'd')
                        ->where          ('r.egreso = true')
                        ->andWhere       ('p.periodo = '.date('Y'))
                        ->andWhere       ("(r.general = true or $where)")
                        ->orderBy        ('r.nombreRubro', 'asc')
                        ->getQuery       ()
                        ->execute        ();

            $organizaciones = $this->em->createQueryBuilder()
                    ->select         ('o.codigoOrganizacion')
                    ->addselect      ('o.razonSocial')
                    ->from           ('Default_Model_OrganizacionesExternas', 'o')
                  //  ->where          ('o.tipoOrganizacion = 1') // proveedor
                 //   ->orWhere        ('o.tipoOrganizacion = 2') // ambos
                    ->orderBy        ('o.razonSocial', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $tipos = $this->em->createQueryBuilder()
                    ->select         ('t.codigoDocumento')
                    ->addselect      ('t.nombreDocumento')
                    ->from           ('Default_Model_Documento', 't')
                    ->orderBy        ('t.codigoDocumento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // convertir a json
            $this->view->jsonOrganizaciones = \X\Msg::Escape(Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($organizaciones),
                "rows"    => $organizaciones
            )));
            $this->view->jsonCuentas = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($cuentas),
                "rows"    => $cuentas
            ));
            $this->view->jsonTipos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($tipos),
                "rows"    => $tipos
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }

    public function editarAction()
    {
        if (X\CheckAccess::PageAction('Egreso de caja chica.editar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getQuery('id');

            // calcular el permiso
            if      (X\Session::esDirectorGral()) $whereCuenta = '1=1';
            else if (X\Session::esDirectorDpto()) $whereCuenta = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $whereCuenta = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            // obtener los datos
            $this->view->comprobante = $this->em->createQueryBuilder()
                    ->select         ('c')
                    ->from           ('Default_Model_Comprobante', 'c')
                    ->leftjoin       ('c.usuario',                 'u')
                    ->leftjoin       ('u.departamento',            'd')
                    ->where          ("c.codigoComprobante = $id")
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->getSingleResult();
            
            $cuentas = $this->em->createQueryBuilder()
                    ->select         ('c.codigoCuenta')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('r.codigo')
                    ->from           ('Default_Model_Cuenta', 'c')
                    ->leftJoin       ('c.rubro',              'r')
                    ->leftJoin       ('c.presupuesto',        'p')
                    ->leftJoin       ('c.departamento',       'd')
                    ->where          ("r.egreso = true")
                    ->andWhere       ('p.periodo = '.$this->view->comprobante->getYearComprobante())
                    ->andWhere       ("r.general = true or $whereCuenta")
                    ->orderBy        ('r.nombreRubro', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $organizaciones = $this->em->createQueryBuilder()
                    ->select         ('o.codigoOrganizacion')
                    ->addselect      ('o.razonSocial')
                    ->from           ('Default_Model_OrganizacionesExternas', 'o')
                    ->where          ('o.tipoOrganizacion = 1') // proveedor
                    ->orWhere        ('o.tipoOrganizacion = 2') // ambos
                    ->orderBy        ('o.razonSocial', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $tipos = $this->em->createQueryBuilder()
                    ->select         ('t.codigoDocumento')
                    ->addselect      ('t.nombreDocumento')
                    ->from           ('Default_Model_Documento', 't')
                    ->orderBy        ('t.codigoDocumento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $movimientos = $this->em->createQueryBuilder()
                    ->select         ('m.cantidad')
                    ->addselect      ('m.concepto')
                    ->addselect      ('m.monto')
                    ->addselect      ('m.observaciones')
                    ->addselect      ('m.codigoMovimiento')
                    ->addselect      ('t.codigoCuenta')
                    ->addselect      ('r.codigo')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('m.cuenta',                 't')
                    ->leftjoin       ('t.rubro',                  'r')
                    ->leftjoin       ('m.solicitud',              's')
                    ->where          ("c.codigoComprobante = $id")
                    ->andWhere       ("s.codigoSolicitud is null")
                    ->getQuery       ()
                    ->execute        ();

            if (count($movimientos) == 0){
                $this->view->error = 'El movimiento está siendo utilizado por una solicitud.';
                return;
            }

            // convertir a json
            $this->view->jsonCuentas = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($cuentas),
                "rows"    => $cuentas
            ));
            $this->view->jsonOrganizaciones = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($organizaciones),
                "rows"    => $organizaciones
            ));
            $this->view->jsonMovimientos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($movimientos),
                "rows"    => $movimientos
            ));
            $this->view->jsonTipos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($tipos),
                "rows"    => $tipos
            ));
        }
        catch(Doctrine\ORM\NoResultException $e){
            $this->view->error = 'No se encontró los datos.';
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }

    public function listarAction()
    {
        if (X\CheckAccess::PageAction('Egreso de caja chica.listar')) return;

        try{
            
            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            // obtener los datos
            $movimientos = $this->em->createQueryBuilder()
                    //Monto
                    ->select         ('m.codigoMovimiento')
                    ->addselect      ('m.cantidad')
                    ->addselect      ('m.concepto')
                    ->addselect      ('m.monto')
                    ->addselect      ('m.observaciones')
                    ->addselect      ('c.codigoComprobante')
                    ->addselect      ('c.numeroComprobante')
                    ->addselect      ('m.fechaMovimiento')
                    ->addselect      ('r.codigo')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('o.razonSocial')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('c.usuario',                'u')
                    ->leftjoin       ('u.departamento',           'd')
                    ->leftjoin       ('m.cuenta',                 't')
                    ->leftjoin       ('t.rubro',                  'r')
                    ->leftjoin       ('c.organizacionesExternas', 'o')
                    ->where          ('m.tipoMovimiento = 3')
                    ->andWhere       ('m.solicitud is null')
                    ->andWhere       ($where)
                    ->orderBy        ('c.numeroComprobante', 'asc')
                    ->setFirstResult (0)
                    ->setMaxResults  (20)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select         ('count(m.codigoMovimiento)')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('c.usuario',                'u')
                    ->leftjoin       ('u.departamento',           'd')
                    ->where          ('m.tipoMovimiento = 3')
                    ->andWhere       ('m.solicitud is null')
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->getSingleScalarResult();

            // convertir a json
            $this->view->jsondata = Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $movimientos
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }

    //---------------------------------//
    //               AJAX              //
    //---------------------------------//

    public function ajaxCrearAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Egreso de caja chica.crear')) return;

        try{
            // obtener los parametros
            $numeroComprobante  = $this->_request->getPost('numeroComprobante');
            $fechaComprobante   = $this->_request->getPost('fechaComprobante');
            $codigoOrganizacion = $this->_request->getPost('codigoOrganizacion');
            $codigoDocumento    = $this->_request->getPost('codigoDocumento');
            $editorRows         = $this->_request->getPost('editorRows');

            // obtener los datos
            $proveedor    = $this->em->find('Default_Model_OrganizacionesExternas', $codigoOrganizacion);
            $usuario      = $this->em->find('Default_Model_Usuario', X\Session::codigoUsuario());
            $documento    = $this->em->find('Default_Model_Documento', $codigoDocumento);
            $departamento = $usuario->getDepartamento();
            $rows         = Zend_Json::decode($editorRows);

            // verificar los datos
            if (count($rows) == 0){
                X\Msg::Failure('Por lo menos un movimiento.'); return;
            }

            // crear
            $comprobante = new Default_Model_Comprobante;
            $comprobante->setNumeroComprobante     ($numeroComprobante);
            $comprobante->setMontoTotal            (0);
            $comprobante->setFechaComprobante      ($fechaComprobante);
            $comprobante->setOrganizacionesExternas($proveedor);
            $comprobante->setDocumento             ($documento);
            $comprobante->setUsuario               ($usuario);

            // crear movimientos
            foreach($rows as $row){

                $cuenta = $this->em->find('Default_Model_Cuenta', $row['codigoCuenta']);
                
                $movimiento = new Default_Model_Movimiento;
                $movimiento->setTipoMovimiento (3);
                $movimiento->setFechaMovimiento($fechaComprobante);
                $movimiento->setCantidad       ($row['cantidad']);
                $movimiento->setConcepto       ($row['concepto']);
                $movimiento->setMonto          ($row['monto']);
                $movimiento->setObservaciones  ($row['observaciones']);
                $movimiento->setCuenta         ($cuenta);
                $movimiento->setComprobante    ($comprobante);
                $comprobante->addMovimiento    ($movimiento);
                
                // CALCULO-CUENTA : los egresos de caja chica, se resta de la caja chica del departamento del usuario
                $departamento->setCajaChica( $departamento->getCajaChica() - $movimiento->getMonto() );

            }
            // guardar
            $this->em->persist($comprobante);
            $this->em->flush();

            if ($departamento->getCajaChica() < 0){
                X\Msg::Success('El egreso se ha creado con éxito.<br><br><b>Atención: ha superado el monto de Caja Chica</b>');
            }
            else{
                X\Msg::Success('El egreso se ha creado con éxito.');
            }

            
        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear el egreso.'.$editorRows);
        }
    }

    public function ajaxEditarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Egreso de caja chica.editar')) return;

        try{
            // obtener los parametros
            $codigoComprobante   = $this->_request->getPost('codigoComprobante');
            $numeroComprobante   = $this->_request->getPost('numeroComprobante');
            $fechaComprobante    = $this->_request->getPost('fechaComprobante');
            $codigoOrganizacion  = $this->_request->getPost('codigoOrganizacion');
            $codigoDocumento     = $this->_request->getPost('codigoDocumento');
            $editorRows          = $this->_request->getPost('editorRows');

            

            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            if      (X\Session::esDirectorGral()) $codigoDepartamento;
            else if (X\Session::esDirectorDpto()) $codigoDepartamento = X\Session::codigoDepartamento();
            else                                  $codigoDepartamento = X\Session::codigoDepartamento();

            // obtener los datos
            $rows         = Zend_Json::decode($editorRows);
            $proveedor    = $this->em->find('Default_Model_OrganizacionesExternas', $codigoOrganizacion);
            $usuario      = $this->em->find('Default_Model_Usuario', X\Session::codigoUsuario());
            $documento    = $this->em->find('Default_Model_Documento', $codigoDocumento);
            $departamento = $usuario->getDepartamento();
            $comprobante  = $this->em->createQueryBuilder()
                    ->select         ('c')
                    ->from           ('Default_Model_Comprobante', 'c')
                    ->leftjoin       ('c.usuario',                 'u')
                    ->leftjoin       ('u.departamento',            'd')
                    ->where          ("c.codigoComprobante = $codigoComprobante")
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->getSingleResult();

            // verificar datos
            if (count($rows) == 0){
                X\Msg::Failure('Por lo menos un movimiento.'); return;
            }

            $arr = array();

            foreach($comprobante->getMovimientos() as $movimiento){
                $arr[]=$movimiento->getCodigoMovimiento();
            }

            // editar
            $comprobante->setNumeroComprobante     ($numeroComprobante);
            $comprobante->setMontoTotal            (0);
            $comprobante->setFechaComprobante      ($fechaComprobante);
            $comprobante->setOrganizacionesExternas($proveedor);
            $comprobante->setDocumento             ($documento);
            $movimientoExistente = array();
            foreach($rows as $row){

                $movimiento = $this->em->find('Default_Model_Movimiento', $row['codigoMovimiento']);
                $cuenta     = $this->em->find('Default_Model_Cuenta',     $row['codigoCuenta']);

                // si existe el movimiento
                if (isset($row['codigoMovimiento'])){
                    // CALCULO-CUENTA : restaurar
                    $departamento->setCajaChica( $departamento->getCajaChica() + $movimiento->getMonto() );

                    // editar
                    $movimiento->setFechaMovimiento($fechaComprobante);
                    $movimiento->setCantidad       ($row['cantidad']);
                    $movimiento->setConcepto       ($row['concepto']);
                    $movimiento->setMonto          ($row['monto']);
                    $movimiento->setObservaciones  ($row['observaciones']);
                    $movimiento->setCuenta         ($cuenta);
                    $movimientoExistente[] = $row['codigoMovimiento'];

                    // CALCULO-CUENTA : los egresos de caja chica, se resta de la caja chica del departamento del usuario
                    $departamento->setCajaChica( $departamento->getCajaChica() - $movimiento->getMonto() );
                }
                // si no existe
                else{
                    $movimiento = new Default_Model_Movimiento;
                    $movimiento->setTipoMovimiento (3);
                    $movimiento->setFechaMovimiento($fechaComprobante);
                    $movimiento->setCantidad       ($row['cantidad']);
                    $movimiento->setConcepto       ($row['concepto']);
                    $movimiento->setMonto          ($row['monto']);
                    $movimiento->setObservaciones  ($row['observaciones']);
                    $movimiento->setCuenta         ($cuenta);
                    $movimiento->setComprobante    ($comprobante);
                    $comprobante->addMovimiento    ($movimiento);

                    // CALCULO-CUENTA : los egresos de caja chica, se resta de la caja chica del departamento del usuario
                    $departamento->setCajaChica( $departamento->getCajaChica() - $movimiento->getMonto() );
                }
            }
            
            // eliminar los movimientos sobrantes
            foreach($arr as $arrid){
                if (array_search($arrid, $movimientoExistente) === false){
                    // CALCULO-CUENTA : restaurar
                    $movimiento = $this->em->find('Default_Model_Movimiento', $arrid);
                    $departamento->setCajaChica( $departamento->getCajaChica() + $movimiento->getMonto() );
                    
                    $this->em->remove($movimiento);
                }
            }

            // guardar
            $this->em->persist($comprobante);
            $this->em->flush();

            if ($departamento->getCajaChica() < 0){
                X\Msg::Success('El egreso se ha guardado con éxito.<br><br><b>Atención: ha superado el monto de Caja Chica</b>');
            }
            else{
                X\Msg::Success('El egreso se ha guardado con éxito.');
            }
        }
        catch(Doctrine\ORM\NoResultException $e){
            X\Msg::Failure('No se encontró los datos.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al guardar el egreso.');
        }
    }

    public function ajaxListarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Egreso de caja chica.listar')) return;

        try{
            // obtener los parametros
            $start = $this->_request->getPost("start");
            $limit = $this->_request->getPost("limit");
            $sort  = $this->_request->getPost("sort");
            $dir   = $this->_request->getPost("dir");

            // si está vacío
            $sort = isset($sort)? $sort : 'numeroComprobante';
            $dir  = isset($dir)?  $dir  : 'asc';

            // prefijo para diferentes entidades
            $sort = ($sort == 'numeroComprobante'? 'c.' :
                    ($sort == 'nombreRubro'?       'r.' :
                    ($sort == 'valueField'?        'r.' :'m.'))) . ($sort == 'valueField'?'codigo':$sort);

            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            // obtener los datos
            $movimientos = $this->em->createQueryBuilder()
                    ->select         ('m.codigoMovimiento')
                    ->addselect      ('m.cantidad')
                    ->addselect      ('m.concepto')
                    ->addselect      ('m.monto')
                    ->addselect      ('m.observaciones')
                    ->addselect      ('c.codigoComprobante')
                    ->addselect      ('c.numeroComprobante')
                    ->addselect      ('m.fechaMovimiento')
                    ->addselect      ('r.codigo')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('o.razonSocial')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('c.usuario',                'u')
                    ->leftjoin       ('u.departamento',           'd')
                    ->leftjoin       ('m.cuenta',                 't')
                    ->leftjoin       ('t.rubro',                  'r')
                    ->leftjoin       ('c.organizacionesExternas', 'o')
                    ->where          ('m.tipoMovimiento = 3')
                    ->andWhere       ('m.solicitud is null')
                    ->andWhere       ($where)
                    ->orderBy        ($sort, $dir)
                    ->setFirstResult ($start)
                    ->setMaxResults  ($limit)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select         ('count(m.codigoMovimiento)')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('c.usuario',                'u')
                    ->leftjoin       ('u.departamento',           'd')
                    ->where          ('m.tipoMovimiento = 3')
                    ->andWhere       ('m.solicitud is null')
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->getSingleScalarResult();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $movimientos
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al cargar los datos.');
        }
    }

    public function ajaxEliminarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Egreso de caja chica.eliminar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getPost('id');
            
            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            // obtener los datos
            $usuario      = $this->em->find('Default_Model_Usuario', X\Session::codigoUsuario());
            $departamento = $usuario->getDepartamento();
            $movimiento   = $this->em->createQueryBuilder()
                    ->select         ('m')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('c.usuario',                'u')
                    ->leftjoin       ('u.departamento',           'd')
                    ->where          ('m.tipoMovimiento = 3')
                    ->andWhere       ("m.codigoMovimiento = $id")
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->getSingleResult();

            // si es de algun solicitud, restar del montototal
            $solicitud = $movimiento->getSolicitud();
            if (isset($solicitud))
                $solicitud->setMonto($solicitud->getMonto() - $movimiento->getMonto());
            
            // CALCULO-CUENTA : restaurar
            $departamento->setCajaChica( $departamento->getCajaChica() + $movimiento->getMonto() );

            // eliminar el objeto
            $this->em->remove($movimiento);

            // si es el ultimo, eliminar el comprobante asociado
            $comprobante       = $movimiento->getComprobante();
            $numeroComprobante = $comprobante->getNumeroComprobante();
            $cantMovimientos   = $comprobante->getMovimientos()->count();

            if ($cantMovimientos == 1){
                $this->em->remove($comprobante);
            }
            
            $this->em->flush();

            if ($cantMovimientos == 1){
                X\Msg::Success('El egreso se ha eliminado con éxito.<br><br>El comprobante asociado <b>N° '.$numeroComprobante.'</b> fue eliminado <br>por no contener mas movimientos.');
            }
            else{
                X\Msg::Success('El egreso se ha eliminado con éxito.');
            }
        }
        catch(Doctrine\ORM\NoResultException $e){
            X\Msg::Failure('No se encontró los datos.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al eliminar el egreso.');
        }
    }

    public function ajaxCuentaAction()
    {
        try{
            // obtener los parametros
            $fecha = $this->_request->getPost("fecha");
  
         
            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = '(r.general=true or d.codigoDepartamento=' . X\Session::codigoDepartamento() . ')';
            else                                  $where = '(r.general=true or d.codigoDepartamento=' . X\Session::codigoDepartamento() . ')';
            // obtener el periodo
            $explode = explode('T', $fecha);   $explode = $explode[0];
            $explode = explode('-', $explode); $periodo = $explode[0];

            // obtener los datos
            $cuentas = $this->em->createQueryBuilder()
                        ->select         ('c.codigoCuenta')
                        ->addselect      ('r.nombreRubro')
                        ->addselect      ('r.codigo')
                        ->from           ('Default_Model_Cuenta', 'c')
                        ->leftJoin       ('c.rubro',              'r')
                        ->leftJoin       ('c.presupuesto',        'p')
                        ->leftJoin       ('c.departamento',       'd')
                        ->where          ('r.egreso = true')
                        ->andWhere       ("p.periodo = $periodo")
                        ->andWhere       ($where)
                        ->orderBy        ('r.nombreRubro', 'asc')
                        ->getQuery       ()
                        ->execute        ();

            // crear la respuesta en json
            // no utiliza el X\Msg, porque necesita el Escape corrompe
            //   el Json que esta dentro del Json
            echo Zend_Json::encode(Array(
                "success" => true,
                "msg"     => Zend_Json::encode(Array(
                                "success" => true,
                                "total"   => count($cuentas),
                                "rows"    => $cuentas
                            ))
            ));
            
        }
        catch(Exception $e){
            X\Msg::Failure('Error al cargar los datos.');
        }
    }
}